// 📁 service/ReservationService.java
package com.library.management.service;

import com.library.management.entity.Reservation;
import com.library.management.enums.ReservationStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
/**
 * 预约服务接口
 * 处理预约相关的业务逻辑
 */
public interface ReservationService extends BaseService<Reservation, Long> {

    /**
     * 创建预约
     */
    Reservation createReservation(Long userId, Long bookId, LocalDateTime reserveDate, LocalDateTime expireDate);

    /**
     * 取消预约
     */
    Reservation cancelReservation(Long reservationId);

    /**
     * 标记预约为可借阅
     */
    Reservation markReservationAsAvailable(Long reservationId);

    /**
     * 根据用户查找预约记录
     */
    List<Reservation> findByUserId(Long userId);

    /**
     * 根据图书查找预约记录
     */
    List<Reservation> findByBookId(Long bookId);

    /**
     * 根据状态查找预约记录
     */
    List<Reservation> findByStatus(ReservationStatus status);

    /**
     * 查找有效的预约记录（状态为等待中且未过期）
     */
    List<Reservation> findValidReservations();

    /**
     * 查找已过期的预约记录
     */
    List<Reservation> findExpiredReservations();

    /**
     * 检查用户是否已经预约了某本图书且预约有效
     */
    boolean hasActiveReservation(Long userId, Long bookId);

    /**
     * 查找图书的预约队列（按优先级和预约时间排序）
     */
    List<Reservation> findReservationQueueByBookId(Long bookId);

    /**
     * 统计用户的预约数量
     */
    long countByUserId(Long userId);

    /**
     * 统计图书的预约数量
     */
    long countByBookId(Long bookId);

    /**
     * 查找需要发送通知的预约记录（图书可用但未发送通知）
     */
    List<Reservation> findReservationsNeedNotification();

    /**
     * 标记预约通知已发送
     */
    void markNotificationSent(Long reservationId);

    /**
     * 查找即将过期的预约记录（在指定天数内过期）
     */
    List<Reservation> findReservationsExpiringSoon(int days);

    /**
     * 处理过期预约（批量将过期预约状态更新为EXPIRED）
     */
    void processExpiredReservations();

    /**
     * 分页查询用户的预约记录
     */
    Page<Reservation> findByUserId(Long userId, Pageable pageable);

    /**
     * 根据用户和图书查找预约记录
     */
    Reservation findByUserIdAndBookId(Long userId, Long bookId);
}